
package hash;
 
import java.util.*;
//import java.util.ListIterator;


public class HashTable {
    public ArrayList<HashMapObject>[] List;
    int N;

    final double LoadFactor = 0.75;
    
    public HashTable() {
        List = new ArrayList[2];
        for (int i = 0; i < 2; i++)   List[i] = new ArrayList<HashMapObject>();
        N = 0;
    }

    
    public static int hashed(String s, int k) { //хэш-функция
        return Math.abs(s.hashCode())%k;
    }

    
    public void set_elem (String s) {//ищем элемент в списке.
        {
            ListIterator<HashMapObject> i = List[hashed(s,List.length)].listIterator();
            while (i.hasNext()) {
                HashMapObject t = i.next();
                if ( t.S.equals(s) ) {
                    t.N++; //+1, если уже есть
                    return;
                }
            }
        }
        
        if (List.length > LoadFactor*N){ 
            
                int newCapacity = 2*List.length;//увеличиваем список
                ArrayList<HashMapObject> [] T = new ArrayList[newCapacity];
                transfer (T); //перераспределяем элементы
                List = T;
                }     
        List[hashed(s,List.length)].add ( new HashMapObject(s,1) ); //добавляем новое слово в список
        N++;
        }
    
    
    void transfer(ArrayList<HashMapObject>[] T) {
            for ( int i = 0; i < 2*List.length; i++) T[i] = new ArrayList<HashMapObject>();
            for ( int i = 0; i < List.length; i++) {
                ListIterator<HashMapObject> j = List[i].listIterator();
                while (j.hasNext()) {
                    HashMapObject t = j.next();
                    T[hashed(t.S, 2*List.length)].add(t);
                }
            }
    }
}
